package com.bobo.utis;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Random;
/**
 * 
 * @ClassName: DateUtil 
 * @Description: 日期工具类
 * @author: charles
 * @date: 2020年12月15日 下午4:26:38
 */
public class DateUtil {
	
	/**
	 * 
	 * @Title: stringToDate 
	 * @Description: 把字符串转为日期
	 * @param date
	 * @param pattern
	 * @return
	 * @return: Date
	 * @throws ParseException 
	 */
 public static Date stringToDate(String pattern ,String date) {
	 SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
	 try {
		return simpleDateFormat.parse(date);
	} catch (ParseException e) {
		e.printStackTrace();
	}
	return null;
 }
	/**
	 * 
	 * @Title: randomDate 
	 * @Description:产生一个随机日期，该日期在某个日期区间
	 * @param d1 开始日期
	 * @param d2 结束日期
	 * @return
	 * @return: Date
	 */
	
	public static Date randomDate(Date d1,Date d2) {
		
		 long t1 = d1.getTime();//获取t1的毫米数
		 long t2 = d2.getTime();//获取t2的毫米数
		long t = (long) ( Math.random()* (t2 - t1)+t1);
		
		
		return new Date(t);
		
	}
	
	

	/**
	 * 功能：根据生日计算年龄 示例：现在是2020-12-15，如果生日是2000-12-16，那结果是19
	 * 
	 * @param Date，生日
	 * @return int 年龄
	 */
	public static int getAge(Date birthday) {

		Calendar c = Calendar.getInstance(); // 获取系统日历类

		int now_year = c.get(Calendar.YEAR); // 获取当前系统的年

		int now_month = c.get(Calendar.MONTH); // 获取当前系统的月

		int now_date = c.get(Calendar.DATE); // 获取当前系统的日

		c.setTime(birthday);// 用生日初始化日历类

		int b_year = c.get(Calendar.YEAR);// 获取生日年

		int b_month = c.get(Calendar.MONTH);// 获取当前生日月

		int b_date = c.get(Calendar.DATE); // 获取当前生日的日

		int age = now_year - b_year;// 获取年龄
		if (now_month < b_month)// 没到生日的月份，年龄-1
			age--;
		if (now_month == b_month && now_date < b_date) // 月份相等 ，当前日期<出生日期
			age--;

		return age;
	}

	/**
	 * 功能：给定时间对象，获取该时间的月初1日0时0分0秒0毫秒 示例：2018-11-11 08:30:16 → 2018-11-01 00:00:00
	 * 使用场景：可用在数据库里查询某月的时间范围
	 *
	 * @param Date 源时间
	 * @return Date 月初时间
	 */
	public static Date getFirstDayOfMonth(Date src) {
		Calendar c = Calendar.getInstance();
		c.setTime(src);// 用传入的日期出生化日历类
		c.set(c.get(Calendar.YEAR), c.get(Calendar.MONTH), 1, 0, 0, 0);

		return c.getTime();
	}

	/**
	 * 功能：给定时间对象，获取该时间的月末最后一天的23时23分59秒999毫秒 示例：2018-11-11 08:30:16 → 2018-11-30
	 * 23:23:59 使用场景：可用在数据库里查询某月的时间范围
	 *
	 * @param Date 源时间
	 * @return Date 月末时间
	 */
	public static Date getLastDayOfMonth(Date src) {
		// 用传入的月份+1，再设置为月初 ，最后在减去1秒
		Calendar c = Calendar.getInstance();
		c.setTime(src);
		c.add(Calendar.MONTH, 1);// 传入的月份+1
		c.set(c.get(Calendar.YEAR), c.get(Calendar.MONTH), 1, 0, 0, 0);// 再设置为月初
		c.add(Calendar.SECOND, -1);

		return c.getTime();
	}

	/**
	 * 功能：获取当前日期指定天数之前或之后的日期，如果参数为负数，则往前回滚。 示例1：当前是2018-08-08，参数days=5，结果是2018-08-13
	 * 示例2：当前是2018-08-08，参数days=-4，结果是2018-08-04
	 * 
	 * @param int days 偏移的天数，如果为负数则往前回滚。
	 * @return Date 新日期
	 */
	public static Date offsetDate(int days) {
		Calendar c = Calendar.getInstance();
		c.add(Calendar.DAY_OF_MONTH, days);

		return c.getTime();
	}

	/**
	 * 
	 * @Title: offsetDate2
	 * @Description: 让指定月份加指定天数
	 * @param date
	 * @param days
	 * @return
	 * @return: Date
	 */
	public static Date offsetDate(Date date, int days) {
		Calendar c = Calendar.getInstance();
		c.setTime(date);
		c.add(Calendar.DAY_OF_MONTH, days);

		return c.getTime();

	}
	
	/**
	 * 
	 * @Title: offsetMonth 
	 * @Description: 在date 的日期上+- 多少月
	 * @param date
	 * @param years
	 * @return
	 * @return: Date
	 */
	public static Date offsetMonths(Date date,int months) {
		Calendar c = Calendar.getInstance();
		c.setTime(date);
		c.add(Calendar.MONTH, months);

		return c.getTime();
	}

	/**
	 * 
	 * @Title: offsetYears 
	 * @Description: 在date 的日期上+- 多少年
	 * @param date
	 * @param years
	 * @return
	 * @return: Date
	 */
	public static Date offsetYears(Date date,int years) {
		Calendar c = Calendar.getInstance();
		c.setTime(date);
		c.add(Calendar.YEAR, years);

		return c.getTime();
	}
	/**
	 * 功能：获取当前季节，如春季、夏季、秋季、冬季。
	 * 
	 * @return Season 季节
	 */
	public static Season getCurrentSeason() {

		Calendar c = Calendar.getInstance();

		int month = c.get(Calendar.MONTH) + 1;// 获取当前日期的月份
		System.out.println(month);
		if (month > 7 || month == 1) {// 秋冬
			if (month >= 8 && month <= 10)
				return Season.AUTUMN;
			return Season.WINTER;
		} else {
			// 春夏
			if (month > 4)
				return Season.SUMMBER;
			return Season.SPRING;

		}

	}

	/**
	 * 功能：获取人性化时间，例如5分钟之内则显示“刚刚”，其它显示16分钟前、2小时前、3天前、4月前、5年前等
	 *
	 * @param Date date 源时间。
	 * @return 人性化时间
	 */
	public static String getDisplayTime(Date date) {

		long t1 = date.getTime();// 传入日期的毫秒数
		long t2 = new Date().getTime();// 当前日期的毫秒数
		long t = (t2 - t1)/1000/60;// 得到两个日期的差值
		if (t < 5)
			return "刚刚";
		else if (t < 60)
			return t + "分钟前";
		else if (t >= 60 && t < 60 * 24)
			return t / 60 + "小时前";
		else if(t>=60 *24 && t< 60 *24 *30)
			return t/60/24 +"天前";
		else if(t>=60 *24 *30 &&t< 60 *24 *30 *12)
			return t/60/30/24+ "月前";
		else
			return t/60/30/24/12+"年前";

	}
	
	
	/**
	 * 
	 * @Title: getDiffDays 
	 * @Description: 计算两个日期相差多少天
	 * @param date1
	 * @param date2
	 * @return
	 * @return: int
	 */
	public static long getDiffDays(Date date1,Date date2) {
		
		long t1 = date1.getTime();
		long t2 = date2.getTime();
		long t = (t2 - t1)/1000/60/60/24;
		
		return t;
	}
	
	
}
